package com.zwl.minio.service.impl;



import com.atguigu.tingshu.common.util.MD5;
import com.zwl.execption.ZWLException;
import com.zwl.minio.config.MinioProperties;
import com.zwl.minio.service.FileService;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.StatObjectArgs;
import io.minio.errors.ErrorResponseException;
import io.minio.errors.MinioException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;

/**
 * Author:huzhongkui
 * Date: 2024-10-22 星期二 15:13:57
 * Description: 文件操作的实现类
 */
//@Service
@Slf4j
public class FileServiceImpl implements FileService {

    @Autowired
    private MinioProperties minioProperties;

    @Autowired
    private MinioClient minioClient;

    @Override
    public String fileUpload(MultipartFile file) throws Exception {

        // 如何对内容相同的图片文件做去重？
        // 1.MultipartFile文件对象 是不能获取到文件的地址。
        // 1.1 获取到图片文件的内容
        InputStream inputStream = file.getInputStream();
        byte[] bytes = inputStream.readAllBytes();
        String encrypt = MD5.encrypt(new String(bytes)); // MD5加密 没有文件的后缀
        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."), file.getOriginalFilename().length());
        String minioObjectName = encrypt + suffix;
        // 1.2 借助minio的一个API()
        StatObjectArgs.Builder statObjectArgsBuilder = StatObjectArgs.builder();
        StatObjectArgs statObjectArgs = statObjectArgsBuilder.bucket(minioProperties.getBucketName()).object(minioObjectName).build();
        try {
            minioClient.statObject(statObjectArgs);
            log.info("上传的文件已经在minio中。。。");
            return minioProperties.getEndpointUrl() + "/" + minioProperties.getBucketName() + "/" + minioObjectName;
        } catch (ErrorResponseException e) {
            // 当文件对象不存在的时候 会进到这个异常中  如果这个文件对象存在 不会进入到异常
            log.info("当前上传的图片文件不存在,可以上传");
        }

        String picUrl = "";
        //  操作minio  然后将前端给的文件 上传到minio中  然后拿到minio的地址
        try {
            // 2.开始上传
            PutObjectArgs.Builder builder = PutObjectArgs.builder();
            PutObjectArgs putObjectArgs = builder.bucket(minioProperties.getBucketName()).object(minioObjectName).stream(file.getInputStream(), file.getSize(), -1).build();
            minioClient.putObject(putObjectArgs);
            log.info("成功上传文件到minio中...");
            // http://192.168.200.170:9000/temp/K4QCO3tYkrL3cea5aa02c803eefae0da34eb5c845c06.png
//            picUrl = "http://192.168.200.170:9000/temp/" + originalFilename;
            // 3.定义文件的地址
            picUrl = minioProperties.getEndpointUrl() + "/" + minioProperties.getBucketName() + "/" + minioObjectName;
        } catch (MinioException e) {
            throw new ZWLException(201, "文件上传到minio失败...");
        }

        // 3.返回地址
        return picUrl;
    }
}
